package site.wlwsjsx.iot_backend.mapper;

import org.apache.ibatis.annotations.Param;
import site.wlwsjsx.iot_backend.entity.AlertEvent;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 告警事件 Mapper 接口
 * 对应表：alert_event
 */
public interface AlertEventMapper {

        /**
         * 新增告警事件
         *
         * @param alertEvent 告警事件对象
         * @return 受影响行数（成功为1）
         */
        int insert(AlertEvent alertEvent);

        /**
         * 根据设备ID查询最新的告警事件
         *
         * @param deviceId 设备ID
         * @return 最新告警事件，无数据返回null
         */
        AlertEvent selectLatestByDeviceId(@Param("deviceId") String deviceId);

        /**
         * 根据设备ID和告警类型查询告警事件
         *
         * @param deviceId  设备ID
         * @param alertType 告警类型
         * @return 告警事件列表
         */
        List<AlertEvent> selectByDeviceIdAndType(
                        @Param("deviceId") String deviceId,
                        @Param("alertType") String alertType);

        /**
         * 根据严重程度查询告警事件
         *
         * @param severity 严重程度
         * @return 告警事件列表
         */
        List<AlertEvent> selectBySeverity(@Param("severity") String severity);

        /**
         * 根据时间范围查询告警事件
         *
         * @param startTime 开始时间
         * @param endTime   结束时间
         * @return 告警事件列表
         */
        List<AlertEvent> selectByTimeRange(
                        @Param("startTime") LocalDateTime startTime,
                        @Param("endTime") LocalDateTime endTime);

        /**
         * 分页查询告警事件
         *
         * @param offset   分页偏移量
         * @param pageSize 每页条数
         * @return 告警事件列表
         */
        List<AlertEvent> selectByPage(
                        @Param("offset") int offset,
                        @Param("pageSize") int pageSize);

        /**
         * 查询告警事件总数
         *
         * @return 总记录数
         */
        Long countAll();

        /**
         * 根据条件查询告警事件总数
         *
         * @param deviceId  设备ID（可为null）
         * @param alertType 告警类型（可为null）
         * @param severity  严重程度（可为null）
         * @param startTime 开始时间（可为null）
         * @param endTime   结束时间（可为null）
         * @return 总记录数
         */
        Long countByCondition(
                        @Param("deviceId") String deviceId,
                        @Param("alertType") String alertType,
                        @Param("severity") String severity,
                        @Param("startTime") LocalDateTime startTime,
                        @Param("endTime") LocalDateTime endTime);

        /**
         * 根据条件分页查询告警事件
         *
         * @param deviceId  设备ID（可为null）
         * @param alertType 告警类型（可为null）
         * @param severity  严重程度（可为null）
         * @param startTime 开始时间（可为null）
         * @param endTime   结束时间（可为null）
         * @param offset    分页偏移量
         * @param pageSize  每页条数
         * @return 告警事件列表
         */
        List<AlertEvent> selectByCondition(
                        @Param("deviceId") String deviceId,
                        @Param("alertType") String alertType,
                        @Param("severity") String severity,
                        @Param("startTime") LocalDateTime startTime,
                        @Param("endTime") LocalDateTime endTime,
                        @Param("offset") int offset,
                        @Param("pageSize") int pageSize);

        /**
         * 更新告警事件处理状态
         *
         * @param id        告警事件ID
         * @param processed 处理状态
         * @return 受影响行数
         */
        int updateProcessedStatus(@Param("id") Long id, @Param("processed") Integer processed);

        /**
         * 批量更新告警事件处理状态
         *
         * @param ids       告警事件ID列表
         * @param processed 处理状态
         * @return 受影响行数
         */
        int batchUpdateProcessedStatus(@Param("ids") List<Long> ids, @Param("processed") Integer processed);

        /**
         * 根据ID删除告警事件
         *
         * @param id 告警事件ID
         * @return 受影响行数
         */
        int deleteById(@Param("id") Long id);

        /**
         * 根据时间范围删除过期告警事件
         *
         * @param beforeTime 删除此时间之前的记录
         * @return 受影响行数
         */
        int deleteByTimeBefore(@Param("beforeTime") LocalDateTime beforeTime);
}
